﻿/**
 * @file Logger.h
 * @author huangxb
 * @email 18228033207@163.com
 * @date 2024.04.05
 * @license MIT License
 * @brief 用于记录日志.
 *
 * @htmlonly
 * <span style="font-weight: bold">History</span>
 * @endhtmlonly
 * Version|Auther|Date|Describe
 * ------|----|------|--------
 * V1.0|huangxb|2024.04.05|创建，暂时使用qDebug
 */
#ifndef LOGGER_H
#define LOGGER_H

/* 库头文件 */
#include <QDebug>
#include <QDateTime>
#include <QThread>
#include <iostream>

// 基本情况：没有参数需要处理
void print() {}

// 递归情况：处理一个参数，并递归调用剩余参数
template<typename T, typename... Args>
void print(T first, Args... rest) {
    std::cout << first << " ";
    print(rest...); // 递归调用
}

void Trace(const QString& str)
{
    auto datetime = QDateTime::currentDateTime();
    auto strDateTime = datetime.toString("yyyy/MM/dd hh:mm:ss");
    auto log = QString("[%1][Trace][%2] %3")
                   .arg(strDateTime)
                   .arg(quintptr(QThread::currentThreadId()))
                   .arg(str);

    qDebug() << log;
}

template<typename ...Args>
void Trace(const QString& str, Args ...args)
{
    auto log = Format(str, args...);
    Trace(log);
}

template<typename ...Args>
void Trace(const char* str, Args ...args)
{
    Trace(QString(str), args...);
}

template<typename T, typename ...Args>
QString Format(const QString& str, T arg, Args ...args)
{
    auto log = Format(str, arg);
    return Format(log, args...);
}

template<typename QString>
QString Format(const QString& str, const QString arg)
{
    return str.arg(arg);
}

template<>
QString Format(const QString& str, int arg)
{
    return str.arg(arg);
}

template<>
QString Format(const QString& str, char arg)
{
    return str.arg(arg);
}

template<>
QString Format(const QString& str, bool arg)
{
    return str.arg(arg);
}

template<>
QString Format(const QString& str, short arg)
{
    return str.arg(arg);
}

template<>
QString Format(const QString& str, unsigned int arg)
{
    return str.arg(arg);
}

template<>
QString Format(const QString& str, long arg)
{
    return str.arg(arg);
}

template<>
QString Format(const QString& str, unsigned long arg)
{
    return str.arg(arg);
}

QString Format(const QString &str)
{
    return str;
}

#endif // LOGGER_H
